package com.dh.leetcode.four;

import org.junit.Assert;
import org.junit.Test;

/**
 * ClassName: _482_license_key_formatting
 *
 * @author shouzimu
 * @Description: 482. 密钥格式化
 *
 * 有一个密钥字符串 S ，只包含字母，数字以及 '-'（破折号）。其中， N 个 '-' 将字符串分成了 N+1 组。
 *
 * 给你一个数字 K，请你重新格式化字符串，使每个分组恰好包含 K 个字符。特别地，第一个分组包含的字符个数必须小于等于 K，但至少要包含 1 个字符。两个分组之间需要用 '-'（破折号）隔开，并且将所有的小写字母转换为大写字母。
 *
 * 给定非空字符串 S 和数字 K，按照上面描述的规则进行格式化。
 *
 *  
 *
 * 示例 1：
 *
 * 输入：S = "5F3Z-2e-9-w", K = 4
 * 输出："5F3Z-2E9W"
 * 解释：字符串 S 被分成了两个部分，每部分 4 个字符；
 *      注意，两个额外的破折号需要删掉。
 * 示例 2：
 *
 * 输入：S = "2-5g-3-J", K = 2
 * 输出："2-5G-3J"
 * 解释：字符串 S 被分成了 3 个部分，按照前面的规则描述，第一部分的字符可以少于给定的数量，其余部分皆为 2 个字符。
 *  
 *
 * 提示:
 *
 * S 的长度可能很长，请按需分配大小。K 为正整数。
 * S 只包含字母数字（a-z，A-Z，0-9）以及破折号'-'
 * S 非空
 *
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/license-key-formatting
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @date 2021/10/4 22:20
 */
public class _482_license_key_formatting {

    /**
     * 题目解析：
     * 分隔后第一段可以小于 K，剩余的必须等于 K
     *
     * 可以先遍历出有效长度进行分隔
     * 使用两个下标分别记录总字符串进度和
     *
     *
     * @param s
     * @param k
     * @return
     */
    public String licenseKeyFormatting(String s, int k) {
        int len = 0;
        char[] chars = s.toUpperCase().toCharArray();
        for (char aChar : chars) {
            if (aChar != '-') {
                len++;
            }
        }

        int firstLength = len % k;
        StringBuilder str = new StringBuilder();
        boolean first = true;
        int index = 0;
        int charLen = 0;
        for (char aChar : chars) {
            if (aChar != '-') {
                str.append(aChar);
                index++;
                charLen++;
                if (index % (first ? firstLength == 0 ? k : firstLength : k) == 0) {
                    first = false;
                    if (charLen < len) {
                        str.append('-');
                    }
                    index = 0;
                }
            }
        }
        return str.toString();

    }

    @Test
    public void licenseKeyFormattingTest() {
        Assert.assertEquals("24-A0R-74K", licenseKeyFormatting("2-4A0r7-4k", 3));
        Assert.assertEquals("2-5G-3J", licenseKeyFormatting("2-5g-3-J", 2));
        Assert.assertEquals("5F3Z-2E9W", licenseKeyFormatting("5F3Z-2e-9-w", 4));
    }
}
